C++ 头文件系列(system |
您所在的位置:网站首页 › c++ system函数头文件 › C++ 头文件系列(system |
1.为什么system_error
"....report error conditions originating from the operating system or low-level application program interfaces." 报告源于操作系统或低层程序接口的错误。 更进一步说,< system_error >提供了用于报告该方面错误的异常机制,是对的扩展。 2.怎么用system_error物以类聚,功能也以“类”分。 刚看到这个头文件的内容,我也有点懵逼,让我们先理清类与类之间的关系: 虽然这几个类之间存在非常复杂的转换构造关系(实际上error_condition也可以通过error_category构造,但为了思路清晰,涂中没有给出),但我们记住一点----system_error是runtime_error的子类,是异常类。 因此在使用时,我们只要抓住system_error类就行了,构造并抛出。 这里system_error主要有两种构造方法: 借助error_code类构造 借助error_condition类(通常通过errc枚举来构造)构造这样一来我们的使用思路就很清晰了,都在图中,具体细节这里就不赘述了。 3.有趣的system_error这里有个有趣的东西: template struct is_error_code_enum : public false_type {} template struct is_error_condition_enum : public false_type {}从名字就能推测出,这两个结构体用来控制其他类型到error_code和error_condition类型的自动转换。 说到自动转换,肯定是通过类的conversion constructor进行的。 那么问题就来了,想要能进行类型转换,肯定得定义一个转换构造器;如果不想,就不能定义。 但这里只通过显示特化上面两个类,就能实现上述行为,这是怎么做到的呢? 这利用了模板函数 对重载决议的影响,也就是SFINAE(Substitute Error Is Not An Error)。 3.1 SFINA下面举个例子: template struct MyType { }; template struct MyType { typedef double type; }; template void func(T t) { std::cout 类型定义了成员类型type,所以当函数func进行重载决议时发现MyType< int >类型没有成员类型type,无法对TT类型进行替换,因此签名为void func< int >(int t)的函数将会从重载函数集中去掉,结果就是不存在这样的重载函数, 上面的两个函数调用只有参数为double的能通过编译。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |